#include <iostream>
using std::cout;
using std::endl;

class Point{
public:
    Point(){
        cout << "Point()" << endl;
    }

    //初始化列表的形式
    //在构造函数参数列表后，函数体之前
    //以:开头，多个数据成员的初始化以，隔开
    //推荐每个数据成员的初始化独占一行
    Point(int x,int y)
    : _ix(x)
    , _iy(y)
    {
        cout <<"Point(int,int)" << endl;
    }

    Point(const Point & rhs)
    : _ix(rhs._ix)
    , _iy(rhs._iy)
    {
        cout << "Point(const Point&)" << endl;
    }

    //赋值运算符函数不属于构造函数
    //不能使用初始化列表
    //
    //在类的所有成员函数中都有一个隐含的this指针
    //this代表的是当前对象
    //在编译之后，编译器会自动加上该指针
    //this指针的形式：Point * const this
    //这里的作用是为了不会改变指向，永远指向本对象
    Point & operator=(const Point & rhs){
        this->_ix = rhs._ix;
        this->_iy = rhs._iy;
        cout << "Point &operator=" << endl;
        return *this;
    } 

    void print(){
        cout << "(" << _ix << ","
            << _iy << ")" << endl;
    }
private:
    int _ix;
    int _iy;
};

void test0(){
    Point pt(2,3);
    Point pt2(4,5);

    //对象都已经创建，用一个对象去复制给另一个对象
    //调用赋值运算符函数
    pt = pt2;
    //谁调用成员函数，this指针就指向谁
    //代表的本对象
    pt.print();
    pt2.print();

    int a = 1;
    int b = 2;
    a = b;
}

int main(void){
    test0();
    return 0;
}
